eclintで既存ファイルからのEditorConfig作成&既存ファイルへのEditorConfig設定適用をしてみた
はじめに
Pull-Requestにてファイル末に改行指定がないことを指摘され、IntelliJにはEditorConfigを用いた空行自動挿入の仕組みがあることを知ったものの、意図した通りには動いていないように見えました。
CommandLine-Toolや関連リポジトリを辿った結果、動作で腑に落ちない点が解消できたので、関連ライブラリ交えて使い方をまとめました。
EditorConfigの導入
IntelliJ等、仕組みとして備わっているエディタについては特に気にする必要もありません。EclipseやVim、Visual Studio Codeについてはプラグインの追加が必要です。
EditorConfigの使い方
既存ファイルに対してフォーマット整形する類のものではありません。要するに新規作成したファイルに対して自動で設定が行われます。
Existing files are not reformatted by the plugin (only newly input lines are formatted in the format given in the .editorconfig files) but if you would like to use a separate tool to do this then see the next question.
既存ファイルにEditorConfigのチェックを通す
eclintを利用します。
% npm install -g eclint /path/to/.anyenv/envs/nodenv/versions/10.15.3/bin/eclint -> /path/to/.anyenv/envs/nodenv/versions/10.15.3/lib/node_modules/eclint/bin/eclint.js + eclint@2.8.1 added 232 packages from 387 contributors in 10.999s
.editorconfig
が存在する場合は適用された上でチェックされ、更にコマンドラインでオプションとして追加指定した場合は指定で上書きされた状態でチェックされます。
% eclint check --help eclint check [globs...] Validate that file(s) adhere to .editorconfig settings オプション: --help ヘルプを表示 [真偽] --version バージョンを表示 [真偽] --indent_style, -i Indentation Style [選択してください: "tab", "space", undefined] --indent_size, -s Indentation Size (in single-spaced characters) [数値] --tab_width, -t Width of a single tabstop character [数値] --end_of_line, -e Line ending file format (Unix, DOS, Mac) [選択してください: "lf", "crlf", "cr", undefined] --charset, -c File character encoding [選択してください: "latin1", "utf-8", "utf-8-bom", "utf-16le", "utf-16be", undefined] --trim_trailing_whitespace, -w Denotes whether whitespace is allowed at the end of lines [真偽] --insert_final_newline, -n Denotes whether file should end with a newline [真偽] --max_line_length, -m Forces hard line wrapping after the amount of characters specified [数値] --block_comment_start Block comments start with [文字列] --block_comment Lines in block comment start with [文字列] --block_comment_end Block comments end with [文字列]
1ファイル指定の場合は以下の指定になります。
% eclint check path/to/file path/to/file 26:120 ❌ invalid line length: 122, exceeds: 120
複数ファイルを同時に行う場合はアスタリスクを利用します。
% eclint check */**/* path/to/file1 26:120 ❌ invalid line length: 122, exceeds: 120 path/to/file2 26:120 ❌ invalid line length: 122, exceeds: 120
チェックした上で修正も入れたい場合にはeclint fix
を実施します。指定可能なオプションはeclint check
とほぼ変わりません。
注意事項としてはドキュメントにもある通り、修正される内容を十分に確認の上で行ってください。
Warning! Fixing your files will change their contents. Ensure that your files are under version control and that you have committed your changes before attempting to fix any issues with them. You can also run the check command to know which files will change before you fix them.
既存ファイルを元に設定を出力する
作成済みのソースコードを元に設定ファイル出力も可能です。複数の設定が入り混じっている場合は、スコアとしての確認も可能です。
% eclint infer --score path/to/file | jq -r '.' { "charset": { "": 1 }, "indent_style": { "space": 1 }, "indent_size": { "2": 1 }, "trim_trailing_whitespace": { "true": 15 }, "end_of_line": { "lf": 15 }, "insert_final_newline": { "true": 1 }, "max_line_length": 51 }
ini形式での設定確認
% eclint infer --ini path/to/file # EditorConfig is awesome: http://EditorConfig.org [*] charset = indent_style = space indent_size = 2 trim_trailing_whitespace = true end_of_line = lf insert_final_newline = true max_line_length = 60
設定ファイルとして出力する
% eclint infer --ini path/to/file > .editorconfig
あとがき
.editorconfig
を作ったものの、保存しても既存ファイルに適用された様子がなく、何が原因かを調べる中で見つけたライブラリでした。
差分確認は必須ですが、すでに存在するファイルへの一括適用等も簡単に行えるため、後から設定した場合にはおすすめです。